/**
 *
 */
package com.newer.biz.sys.menu.impl;

import com.newer.biz.sys.auth.ShiroBiz;
import com.newer.biz.sys.menu.MenuInfoBiz;
import com.newer.commons.constants.CommonConstants;
import com.newer.commons.constants.StateConstants;
import com.newer.commons.result.BizResult;
import com.newer.dao.bean.sys.Menu;
import com.newer.dao.bean.sys.MenuPermission;
import com.newer.dao.bean.sys.Permission;
import com.newer.dao.bean.sys.User;
import com.newer.dao.mapper.sys.MenuMapper;
import com.newer.dao.mapper.sys.MenuPermissionMapper;
import com.newer.dao.mapper.sys.PermissionMapper;
import com.newer.dao.mapper.sys.RoleMenuMapper;
import com.newer.utils.ShiroAuthUtils;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.newer.utils.GenIdUtils.genId;
import static com.newer.utils.ShiroAuthUtils.getAuthUser;

/**
 * 菜单信息管理业务实现类
 *
 * @author xuntj
 * @create 2018-03-15 14:48
 **/
@Component
public class MenuInfoBizImpl implements MenuInfoBiz {

    /**
     * 日志信息打印
     */
    Logger logger = LogManager.getLogger(this.getClass());

    /**
     * 自动注入菜单数据库操作类
     */
    @Autowired
    MenuMapper menuMapper;

    /**
     * 角色菜单数据库操作类
     */
    @Autowired
    RoleMenuMapper roleMenuMapper;

    /**
     * 菜单权限数据库操作类
     */
    @Autowired
    MenuPermissionMapper menuPermissionMapper;

    /**
     * 权限数据库操作类
     */
    @Autowired
    PermissionMapper permissionMapper;

    /**
     * 查询所有的菜单信息
     *
     * @return
     */
    @Override
    public BizResult<Menu> queryAllMenus(String isMenu) {
        BizResult<Menu> bizResult = new BizResult<>();
        try {
            // 查询所有的菜单信息
            List<Menu> menus = menuMapper.selectAllMenus(StateConstants.VALIDE, isMenu);
            bizResult.setResults(menus);
            bizResult.setSuccess(true);
        } catch (Exception e) {
            logger.error("查询所有菜单信息失败,失败原因:" + e.getCause(), e);
            bizResult.setMsg("查询所有菜单信息失败,请联系开发人员.");
        }
        return bizResult;
    }

    /**
     * 根据ID查询菜单详细信息
     *
     * @param menuId
     * @return
     */
    @Override
    public BizResult<Menu> queryMenuInfoById(String menuId) {
        BizResult<Menu> bizResult = new BizResult<>();
        try {
            // 根据ID查询菜单信息
            Menu menu = menuMapper.selectById(menuId);
            // 判断菜单是否为空
            if (menu != null) {
                // 查询菜单对应的权限信息
                List<MenuPermission> menuPermissions = menuPermissionMapper.selectByMenuId(menuId);
                // 设置菜单权限
                menu.setMenuPermissions(menuPermissions);
                bizResult.setResult(menu);
            }
            bizResult.setSuccess(true);
        } catch (Exception e) {
            logger.error("查询菜单详细信息失败,失败原因:" + e.getCause(), e);
            bizResult.setMsg("查询菜单详细信息失败,请联系开发人员.");
        }
        return bizResult;
    }

    /**
     * 菜单信息修改
     *
     * @param menu
     * @return
     */
    @Override
    @Transactional
    public BizResult<?> operateMenuInfo(Menu menu, List<String> permissionIds) {
        BizResult<Menu> bizResult = new BizResult<>();
        try {
            // 判断是否新增菜单
            if (StringUtils.isNotBlank(menu.getId())) {
                // 判断类型是否为菜单类型
                if (!StringUtils.equals(menu.getIsButton(), CommonConstants.IS_MENU)) {
                    menu.setMenuUrl(StringUtils.EMPTY);
                }
                // 查询所有的菜单信息
                menuMapper.updateById(menu);
                // 判断是否存在权限信息
                if (CollectionUtils.isNotEmpty(permissionIds)
                        || !menu.getNeedPermission().equals(CommonConstants.NEED_PERMISSION)) {
                    Map<String, Object> menuMap = new HashMap<>();
                    menuMap.put("menu_id", menu.getId());
                    // 删除所有关联数据
                    menuPermissionMapper.deleteByMap(menuMap);
                }
            } else {
                // 新增菜单操作
                User user = getAuthUser(SecurityUtils.getSubject());
                // 判断类型是否为菜单类型
                if (!StringUtils.equals(menu.getIsButton(), CommonConstants.IS_MENU)) {
                    menu.setMenuUrl(StringUtils.EMPTY);
                }
                menu.setId(genId());
                menu.setCreateTime(new Date());
                menu.setStatus(StateConstants.VALIDE);
                menu.setCreateId(user.getId());
                menu.setCreater(user.getRealName());
                menuMapper.insertSelective(menu);
            }
            // 判断是否为空
            if (CollectionUtils.isNotEmpty(permissionIds)) {
                // 循环设置的权限ID
                for (String permissionId : permissionIds) {
                    MenuPermission menuPermission = new MenuPermission();
                    // 查询权限信息
                    Permission permission = permissionMapper.selectByPrimaryKey(permissionId);
                    menuPermission.setPermissionCode(permission.getPermissionCode());
                    menuPermission.setId(genId());
                    menuPermission.setPermissionId(permissionId);
                    menuPermission.setMenuId(menu.getId());
                    menuPermission.setPermissionName(permission.getPermissionName());
                    menuPermission.setRelType(menu.getRelType());
                    //插入数据
                    menuPermissionMapper.insertSelective(menuPermission);
                }
            }
            // 重置访问权限
            // 设置返回结果
            bizResult.setResult(menu);
            bizResult.setSuccess(true);
        } catch (Exception e) {
            logger.error("菜单信息操作失败,失败原因:" + e.getCause(), e);
            bizResult.setMsg("菜单信息操作失败,请联系开发人员.");
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        return bizResult;
    }

    /**
     * 根据ID删除菜单
     *
     * @param menuId
     * @return
     */
    @Override
    public BizResult<?> delMenuInfoById(String menuId) {
        BizResult<?> bizResult = new BizResult<>();
        try {
            Menu menu = new Menu();
            menu.setId(menuId);
            menu.setStatus(StateConstants.UN_VALIDE);
            menuMapper.updateById(menu);
            // 删除菜单权限信息
            Map<String, Object> maps = new HashMap<>();
            maps.put("menu_id", menuId);
            // 删除所有关联数据
            menuPermissionMapper.deleteByMap(maps);
            // 删除所有关联数据
            roleMenuMapper.deleteByMap(maps);
            bizResult.setSuccess(true);
        } catch (Exception e) {
            logger.error("删除菜单信息失败,失败原因:" + e.getCause(), e);
            bizResult.setMsg("删除菜单信息失败,请联系开发人员.");
        }
        return bizResult;
    }


    /**
     * 根据ID删除角色-菜单信息
     *
     * @param id
     * @return
     */
    @Override
    public BizResult<?> delRoleMenuInfoById(String id) {
        BizResult<?> bizResult = new BizResult<>();
        try {
            //判断菜单是否存在正在使用的角色
            roleMenuMapper.deleteById(id);
            bizResult.setSuccess(true);
        } catch (Exception e) {
            logger.error("删除角色-菜单信息失败,失败原因:" + e.getCause(), e);
            bizResult.setMsg("删除角色-菜单信息失败,请联系开发人员.");
        }
        return bizResult;
    }
}
